package net.onewfour.dao;


import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.DbKit;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.cache.ICache;

/***
 * 数据库基类
 * @author Marc
 * @version 1.0
 */
public class DBSuper {
	
	private static final Object[] NULL_PARAS = new Object[]{};

	public static String FullTable = null ;
	
	private static Logger log = Logger.getLogger(DBSuper.class);

	/***
	 * 获取表全名
	 * @user Marc
	 * @createtime 2015年1月23日 下午5:56:11
	 * @param table
	 * @return
	 */
	protected static final String getFullTable(String table){
		return FullTable+table ;
	}
	
	/***
	 * 获取缓存
	 * @user Marc
	 * @createtime 2015年1月23日 下午5:51:43
	 * @param key
	 * @return 缓存
	 */
	protected <T>T cache(String cacheName,String key){
		ICache cache = DbKit.getConfig().getCache();
		return cache.get(cacheName, key);
	}
	
	/***
	 * 缓存数据
	 * @user Marc
	 * @createtime 2015年1月23日 下午5:57:09
	 * @param cacheName
	 * @param key
	 * @param value
	 */
	protected void cache(String cacheName, Object key, Object value){
		ICache cache = DbKit.getConfig().getCache();
		cache.put(cacheName, key, value);
	}
	
	/***
	 * 根据表名获取
	 * @user Marc
	 * @createtime 2015年1月23日 下午6:03:05
	 * @param tableName
	 * @return
	 */
	protected List<Record> find(String tableName){
		return Db.find("select * from "+getFullTable(tableName));
	}


	/***
	 * 条件查询
	 * @user Marc
	 * @createtime 2015年1月24日 下午8:56:11
	 * @param tableName
	 * @param objects
	 * @param values
	 */
	protected List<Record> findByColumns(String tableName, Object[] objects, Object[] values) {
		StringBuilder sb = new StringBuilder();
		sb.append(" select * from ");
		sb.append(getFullTable(tableName));
		
		if(objects != null && objects.length != 0 && objects.length == values.length ){
			sb.append(" where ");
			for (int i = 0; i < objects.length; i++) {
				sb.append(objects[i] + " = ?");
				if(i+1<objects.length){
					sb.append(" and ");
				}
			}
			
		}else{
			log.error("参数数量和值数量不匹配");
			return null ; 
		}
		
		return Db.find(sb.toString(),values);
	}
	
	
	/***
	 * 重构sql
	 * @user Marc
	 * @createtime 2015年1月24日 下午10:34:23
	 * @param table
	 * @param order
	 * @param where
	 * @return
	 */
	protected String buildSqlExceptSelect(String table, String order,
			String where) {
		StringBuilder sqlBuilder = new StringBuilder();
		sqlBuilder.append(" from ");
		sqlBuilder.append("`");
		sqlBuilder.append(getFullTable(table));
		sqlBuilder.append("`");
		if(where != null )
			sqlBuilder.append(" " + where);
		if(order != null )
			sqlBuilder.append(" " + order);
		return sqlBuilder.toString();
	}

	/**
	 * @see  com.jfinal.plugin.activerecord.Db#paginate
	 * @user Marc
	 * @createtime 2015年1月24日 下午11:29:31
	 * @param pageNumber
	 * @param pageSize
	 * @param select
	 * @param sqlExceptSelect
	 * @param paras
	 * @return
	 */
	protected Page<Record> paginate(int pageNumber, int pageSize, String select,
			String sqlExceptSelect, Object[] paras) {
		if(StringUtils.isBlank(select)){
			select = "select * ";
		}
		if(paras==null){
			paras = NULL_PARAS;
		}
		return Db.paginate(pageNumber, pageSize, select, sqlExceptSelect, paras);
	}

	/***
	 * 保存方法
	 * @see com.jfinal.plugin.activerecord.Db#save
	 * @user Marc
	 * @createtime 2015年1月27日 下午3:15:50
	 * @param table
	 * @param newRecord
	 */
	public void save(String table, Record newRecord) {
		Db.save(getFullTable(table), newRecord);
	}
}
